const {getUserInfo}=require('../service/user.service')
const {userFormateError,
    userAlreadyExited,
    userRegisterError,
    userDoesNotExist,
    userLoginError,
    invalidPassword}=require('../constant/err.type')
const bcrypt=require('bcryptjs')

//用户名或密码为空
const userValidator= async (ctx,next)=>{

    const {user_name,password}=ctx.request.body

  // 合法性
  if (!user_name || !password) {
    console.error('用户名或密码为空', ctx.request.body)
    ctx.app.emit('error', userFormateError, ctx)
    return
  }

  await next()
}

//用户名已经存在
const verifyUser = async (ctx, next) => {
    const { user_name } = ctx.request.body
  
    // if (await getUerInfo({ user_name })) {
    //   ctx.app.emit('error', userAlreadyExited, ctx)
    //   return
    // }
    try {
      const res = await getUserInfo({ user_name })
  
      if (res) {
        console.error('用户名已经存在', { user_name })
        ctx.app.emit('error', userAlreadyExited, ctx)
        return
      }
    } catch (err) {
      console.error('获取用户信息错误', err)
      ctx.app.emit('error', userRegisterError, ctx)
      return
    }
  
    await next()
}

//密码加密
const crpytPassword=async (ctx,next)=>{
    const {password}=ctx.request.body

    const salt = bcrypt.genSaltSync(10)
    // hash保存的是 密文
    const hash = bcrypt.hashSync(password, salt)
  
    ctx.request.body.password = hash
  
    await next()
}

//登录密码验证
const verifyLogin = async (ctx, next) => {
    // 1. 判断用户是否存在(不存在:报错)
    const { user_name, password } = ctx.request.body
  
    try {
      const res = await getUserInfo({ user_name })
  
      if (!res) {
        console.error('用户名不存在', { user_name })
        ctx.app.emit('error', userDoesNotExist, ctx)
        return
      }
  
    //   2. 密码是否匹配(不匹配: 报错)
      if (!bcrypt.compareSync(password, res.password)) {
        ctx.app.emit('error', invalidPassword, ctx)
        return
      }
    } catch (err) {
      console.error(err)
      return ctx.app.emit('error', userLoginError, ctx)
    }
  
    await next()
}

module.exports={
    userValidator,
    verifyUser,
    crpytPassword,
    verifyLogin
}